package com.itany.corejava.code11_io.字节流;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;

/**
 * @author MissChen
 * @version 1.0
 * @date 2023 年11月24日 15:17
 */
public class Test01_FileInputStream {
    public static void main(String[] args) {
        // test01();
        // test02();
        test03();

    }
    public static void test01(){
        FileInputStream in=null;
        try {

             in=new FileInputStream("a.txt");

            // int data=in.read();//从输入流中读取一个数据字节
            // System.out.println(data);

            // 中文根据编码不同，占2-3字节，但是一次读取只能读取一个字节，如果此时读取的是中文，会出现乱码
            // int data=in.read();
            // System.out.println(data);

            int data=in.read();
            while(data!=-1){
                System.out.println((char) data);
                data=in.read();
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {

            // 关闭输入流，释放资源
            // 如:文件、数据库连接、网络连接(谁开谁关)
            // 有可能代码中出现异常导致in没有打开，此时可以不用关闭
            if(in!=null){
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }
    }


    public static void test02(){

        // 在JDK7中引入了一个新的语法，叫做try-with-resource
        // try(){}catch (){}
        // 用于自动关闭外部资源，可以简化关闭的操作
        try (
                // 将所有需要关闭的资源操作，在try的括号中实现
                // 此处只能创建了实现了AutoCloseable接口的对象
                FileInputStream in=new FileInputStream("a.txt");


        ){

            // byte[] b=new byte[4];
            //输入流中将最多 b.length 个字节的数据读入一个 byte 数组
            // 将读取的多个字节传递到参数byte数组中去
            //返回值表示的是读取的字节数(字节总数)

            // int data=in.read(b);
            // System.out.println(data);
            // System.out.println(new String(b));

            // byte[] b=new byte[1000];
            // int data=in.read(b);
            // System.out.println(new String(b));


            byte[] b=new byte[1000];
            int data=-1;
            while((data=in.read(b))!=-1){

                // System.out.println(new String(b));

                //将指定的字节数组从指定索引开始转换，一直转到指定的长度
                // read方法的返回值表示读取的字节的数量
                // new String(b,0,length)
                // 第一个参数：需要转换的字节数组
                // 第二个参数：从哪一个索引开始转换
                // 第三个参数：需要转换多少个字节

                System.out.println(new String(b,0,data));
            }


        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    public static void test03(){
        try(
                //支持绝对路径
                FileInputStream in=new FileInputStream("d:\\Users\\User\\Desktop\\cc\\t.txt");

                //支持相对路径
                // FileInputStream in2=new FileInputStream("a.txt");

                //支持类加载路径
                InputStream in3=Test01_FileInputStream.class.getClassLoader().getResourceAsStream("mya.txt");

        ){
            byte[] b=new byte[1024];
            int data=-1;
            while((data=in3.read(b))!=-1){

                System.out.println(new String(b,0,data));
            }


        }catch (FileNotFoundException e){
            System.out.println(e.getMessage());
        } catch (IOException e) {
            e.printStackTrace();
        }


    }


}
